#ifndef LADDERLINE_HPP
#define LADDERLINE_HPP

#include <QString>
#include <QDateTime>
#include <QUuid>
#include <QJsonObject>
#include <QMetaType>
#include <QDebug>
#include <cmath> // 用于 std::round


struct LadderLine {
    QString    id;
    QString    node;
    int        slotval;
    QDateTime  triggerTime;
    double     trigger; // 新增的 trigger 属性
    int        subFolderNumber;

    // 默认构造函数
    LadderLine()
        : id(QUuid::createUuid().toString())
        , node(QString())
        , slotval(0)
        , triggerTime(QDateTime())
        , trigger(0.0) // 初始化 trigger
    {}

    // 全参构造函数
    LadderLine(const QString &id_,
               const QString &node_,
               int slotval_,
               const QDateTime &triggerTime_,
               double trigger_) // 添加 trigger 参数
        : id(id_)
        , node(node_)
        , slotval(slotval_)
        , triggerTime(triggerTime_)
        , trigger(trigger_) // 初始化 trigger
    {}

    // 简易构造函数 (自动生成 id，trigger 默认为 0.0)
    LadderLine(const QString &node_,
               int slotval_,
               const QDateTime &triggerTime_)
        : LadderLine(
              QUuid::createUuid().toString(),
              node_,
              slotval_,
              triggerTime_,
              0.0) // 默认 trigger 值
    {}

    // 另一个简易构造函数，允许指定 trigger
    LadderLine(const QString &node_,
               int slotval_,
               const QDateTime &triggerTime_,
               double trigger_) // 新增构造函数
        : LadderLine(
              QUuid::createUuid().toString(),
              node_,
              slotval_,
              triggerTime_,
              trigger_) // 初始化 trigger
    {}

    // 转 JSON，triggerTime 保留两位小数，包含 trigger
    QJsonObject toJson() const {
        QJsonObject obj;
        obj["id"]           = id;
        obj["node"]         = node;
        obj["slotval"]      = slotval;
        obj["triggerTime"]  = formatTriggerTime(triggerTime);
        obj["trigger"]      = trigger; // 添加 trigger 到 JSON
        obj["subFolderNumber"] = subFolderNumber; // 添加 trigger 到 JSON
        return obj;
    }

    // 格式化 triggerTime，保留两位小数
    static QString formatTriggerTime(const QDateTime& dt) {
        // 自定义格式，包含毫秒
        QString formattedTime = dt.toString("yyyy-MM-ddTHH:mm:ss.zzz");

        // 将毫秒转换为两位小数
        int msec = dt.time().msec();
        // 四舍五入到两位小数
        int centisec = static_cast<int>(std::round(msec / 10.0));

        // 处理四舍五入后可能的进位（例如 999 毫秒 -> 100 centisec）
        if (centisec >= 100) {
            centisec = 0;
            QDateTime newDt = dt.addSecs(1);
            formattedTime = newDt.toString("yyyy-MM-ddTHH:mm:ss.") + "00";
        } else {
            // 使用 QString::arg 格式化为两位数字
            formattedTime = dt.toString("yyyy-MM-ddTHH:mm:ss.") + QString::number(centisec).rightJustified(2, '0');
        }

        return formattedTime;
    }

    bool operator==(const LadderLine &other) const {
        return id          == other.id
               && node        == other.node
               && slotval     == other.slotval
               && triggerTime == other.triggerTime
               && trigger     == other.trigger; // 比较 trigger
    }
};

// 重载 operator<< 以支持 QDebug 打印 LadderLine 对象
inline QDebug operator<<(QDebug debug, const LadderLine &ll) {
    QJsonObject obj = ll.toJson();
    debug.nospace() << "LadderLine("
                    << "id: " << obj["id"].toString() << ", "
                    << "node: " << obj["node"].toString() << ", "
                    << "slotval: " << obj["slotval"].toInt() << ", "
                    << "triggerTime: " << obj["triggerTime"].toString() << ", "
                    << "trigger: " << obj["trigger"].toDouble()
                    << ")";
    return debug.space();
}

// 也可以提供全局的比较运算符
inline bool operator==(const LadderLine &lhs, const LadderLine &rhs) {
    return lhs.id          == rhs.id
           && lhs.node        == rhs.node
           && lhs.slotval     == rhs.slotval
           && lhs.triggerTime == rhs.triggerTime
           && lhs.trigger     == rhs.trigger; // 比较 trigger
}

// 注册到元对象系统（如在 QVariant、信号槽中使用时）
Q_DECLARE_METATYPE(LadderLine)

#endif // LADDERLINE_HPP
